package demo.icanci.reflect;

import lombok.Getter;
import lombok.Setter;

/**
 * 反射
 *
 * @author icanci
 * @date Created in 2021/02/04 23:29
 * @version 1.0
 */
@Setter
@Getter
@SuppressWarnings("all")
public class ReflectTarget extends ReflectTargetOrigin {
    // ============== 构造函数 ==============
    // 默认带有参数的构造函数
    ReflectTarget(String str) {
        System.out.println("默认的构造方法 str = " + str);
    }

    // 无参构造函数
    public ReflectTarget() {
        System.out.println("无参构造函数");
    }

    // 有一个参数的构造函数
    public ReflectTarget(char name) {
        System.out.println("有一个参数的构造函数，参数为 = " + name);
    }

    // 有多个参数的构造函数
    public ReflectTarget(char name, int index) {
        System.out.println("有一个参数的构造函数，参数为 = " + name + " index = " + index);
    }

    // 收到保护的构造函数
    protected ReflectTarget(boolean n) {
        System.out.println("收保护的构造方法 n = " + n);
    }

    // 私有的构造函数
    private ReflectTarget(int index) {
        System.out.println("私有构造函数 index = " + index);
    }

    // ============== 字段 ==============
    public String    name;
    private String   pwd;
    int              index;
    char             type;
    protected String hello;

    // ============== 成员方法 ==============

    public void show1(String s1) {
        System.out.println("ReflectTarget.show1 s1 = " + s1);
    }

    protected void show2() {
        System.out.println("ReflectTarget.show2");
    }

    void show3() {
        System.out.println("ReflectTarget.show3");
    }

    private void show4(int index) {
        System.out.println("ReflectTarget.show4 index = " + index);
    }

    @Override
    public String toString() {
        return "ReflectTarget{" + "name='" + name + '\'' + ", pwd='" + pwd + '\'' + ", index=" + index + ", type=" + type + ", hello='" + hello + '\'' + '}';
    }

    public static void main(String[] args) throws Exception {
        // 第一种方式获取Class对象
        ReflectTarget reflectTarget = new ReflectTarget();
        Class<? extends ReflectTarget> c1 = reflectTarget.getClass();
        System.out.println(c1.getName());
        // 第二种方式获取Class对象
        Class<ReflectTarget> c2 = ReflectTarget.class;
        System.out.println(c2.getName());
        // 判断是不是一个对象
        System.out.println(c1 == c2);
        // 第三种方式获取Class对象
        Class c3 = Class.forName("demo.icanci.reflect.ReflectTarget");
        System.out.println(c3.getName());
        System.out.println(c2 == c3);
    }
}
